home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / dsp / dspgroup / dataio.arc / TI2INT.C < prev    next >
Encoding:
C/C++ Source or Header  |  1986-10-10  |  7.1 KB  |  250 lines

  1. /* TI2Int        Ver. 0.9   */
  2.  
  3. /* This program will read an TI tagged format file  and convert it     */
  4. /*  to Intel tagged format                                             */
  5.  
  6. #include <stdio.h>
  7. int  s, tag, tmark, ch, nline,  pmsb, plsb, efmark, nofbyte;
  8. int cksummsb, cksumlsb;  /* checksum for msb and lsb files */
  9. int startaddr;      /* load address */
  10. FILE  *fp0, *fp1, *fp2;  /* file pointers */
  11. char filein[15];    /* buffer for input file name */
  12. char filemsb[15];   /* buffer for file name to store most sig. byte */
  13. char filelsb[15];   /* buffer for file name to store least sig. byte */
  14. static char bufmsb[80];  /* temp buffer to store data bytes */
  15. static char buflsb[80];  /* temp buffer to store data bytes for lsb */
  16.  
  17.  
  18. main()             /* main program     */
  19. {
  20. int i;
  21. printf("Enter input file name \n");
  22. scanf("%s",filein);                               /* get input file name */
  23. printf("Enter output file name to store msb\n");
  24. scanf("%s",filemsb);                              /* get file name for msb */
  25. printf("Enter output file name to store lsb\n");
  26. scanf("%s",filelsb);                              /* get file name for lsb */
  27.  
  28. if ((fp0 = fopen(filein,"r")) != NULL)  /* open input file for reading only */
  29.  {
  30. fp1 = fopen(filemsb,"w+");    /* create file for msb              */
  31. fp2 = fopen(filelsb,"w+");    /* create file for lsb              */
  32. pmsb = plsb = 0;              /* set pointers to temp buffers = 0 */
  33. efmark = 0;                   /* eof mark for output files        */
  34. tmark = 0;                    /* marker to count '9' or 'A' tags  */
  35. nline = 1;                    /* line number on input file        */
  36.         tag = fgetc(fp0);     /* get first tag                    */
  37.          if (tag == 'K' )     /* if first tag=K skip next 12 char */
  38.               {
  39.               for (i = 0; i < 12; ++i )
  40.               fgetc(fp0);
  41.               }
  42.           else                /* if K tag not found then error    */
  43.               error(1);
  44.  
  45.       while ((tag = fgetc(fp0)) !=  EOF )   /* get next tag until EOF  */
  46.  
  47.             strip();    /* strip tags        */
  48.  
  49.      printf("Conversion complete \n");
  50.      exit();     /* close all files   */
  51.   }
  52. else
  53.   error(2);
  54. }
  55.  
  56. strip()
  57. {
  58. int  i, data;
  59.  
  60. switch(tag)
  61.    {
  62. case '3' :
  63. case '4' :        /* error, unresolved external references */
  64. case '!' :
  65. case 'E' :
  66. case 'Y' :
  67. case 'Z' :
  68.     error(3);
  69.     break;
  70.  
  71. case 'M' :
  72. case 'I' :
  73. case 'S' :
  74. case 'C' :     /* error, PSEG, CSEG or DSEG relative addresses */
  75. case 'T' :
  76. case '&' :
  77. case '#' :
  78. case 'P' :
  79. case 'N' :
  80.          error(4);
  81.          break;
  82.  
  83. case '1' :             /* ignore next 4 characters    */
  84. case '2' :
  85. case '8' :
  86. case '7' :
  87.     for (i = 0; i < 4; ++i )
  88.     fgetc(fp0);
  89.     break;
  90.  
  91. case 'F' :           /* end of data tag. Ignore characters till eol mark */
  92.         while  (data != '\n')
  93.         data = fgetc(fp0);
  94.         ++nline;
  95.         break;
  96.  
  97. case '9' :             /* read next four characters to give load address */
  98. case 'A' :
  99.         if (tmark > 0 )
  100.         {
  101.         convert();     /* if second 'A' or '9' tag then start new line */
  102.  
  103.         tmark++;
  104.         }
  105.         fscanf(fp0, "%4x", &startaddr );
  106.         tmark++;
  107.         break;
  108.  
  109. case '6' :         /* ignore next ten characters  */
  110. case '5' :
  111. case 'G' :
  112. case 'H' :
  113. case 'U' :
  114.     for (i = 0; i < 10; ++i )
  115.     fgetc(fp0);
  116.     break;
  117.  
  118. case 'W' :          /* ignore next 14 characters    */
  119. case 'J' :
  120.     for (i = 0; i < 14; ++i )
  121.     fgetc(fp0);
  122.     break;
  123.  
  124. case 'B' :      /* read next 4 charcters and split into msb and lsb */
  125.        for (i = 0; i < 2; ++i )
  126.        bufmsb[pmsb++] = fgetc(fp0);
  127.        for (i = 0; i < 2; ++i )
  128.        buflsb[plsb++] = fgetc(fp0);
  129.        if ( pmsb >= 60)
  130.  
  131.          convert();       /* start new line */
  132.  
  133.        break;
  134.  
  135. case ':' :                      /* end of file tag */
  136.  
  137.         convert();              /* output all data in buffers */
  138.  
  139.         efmark = 1;
  140.  
  141.         convert();             /* print eof record   */
  142.  
  143.         printf("Conversion complete \n");
  144.         exit();     /* close all files   */
  145.         break;
  146.  
  147. default :
  148.         error(5);
  149.         break;
  150.    }
  151. }
  152.  
  153. convert()         /* convert to Intel format  */
  154. {
  155. int i, j, k, data;
  156.  
  157. i = 0;        /* loop count for msb file */
  158. j = 0;        /* loop count for lsb file */
  159. nofbyte = pmsb / 2;      /* number of bytes = 1/2 number of charaters */
  160.  
  161. fprintf(fp1, ":%02x%04x", nofbyte, startaddr);     /* output load address   */
  162. fprintf(fp2, ":%02x%04x", nofbyte, startaddr);     /* and # of data bytes   */
  163.  
  164. fprintf(fp1, "%02d",  efmark);
  165. fprintf(fp2, "%02d",  efmark);       /* print whether eof record or not */
  166.  
  167. for (k=0; k < pmsb; ++k )       /* transfer data from buffer to output files */
  168.    {
  169. data = bufmsb[i++];
  170. fputc(data,fp1);
  171.  
  172. data = buflsb[j++];
  173. fputc(data,fp2);
  174.    }
  175. cksumint();       /* go do check sum        */
  176.  
  177. fprintf(fp1,"%02x\n", cksummsb);        /* output checksum          */
  178. fprintf(fp2,"%02x\n", cksumlsb);
  179.  
  180. startaddr += nofbyte;            /* increment load address for next line */
  181. pmsb = plsb = 0;                /* initialize pointers */
  182. }
  183.  
  184.  
  185. cksumint()         /* do checksum       */
  186. {
  187. int  k, m,  n, temp;
  188. char  *p, *q;   /* buffers to store data for checksum */
  189.  
  190. cksummsb  = cksumlsb = nofbyte;
  191.  
  192. m = startaddr & 0xFF00;  /* read msb of load address  */
  193. m =  m >> 8;             /* shift right               */
  194. m += startaddr & 0x00FF ; /* add lsb of load address  */
  195.  
  196. cksummsb += m;            /* add to checksum          */
  197. cksumlsb += m;
  198.  
  199. p = bufmsb;                    /* initialize pointer to start of data bytes*/
  200. for (k=0; k < nofbyte; ++k )    /* transfer data from buffer to output files */
  201.    {
  202. sscanf(p ,"%02x", &temp);     /* convert each byte to hex value */
  203. cksummsb += temp;                /* calculate checksum for msb     */
  204. p += 2;                         /* increment to point at next byte */
  205.    }
  206.  
  207. q = buflsb;
  208. for (k=0; k < nofbyte; ++k )    /* transfer data from buffer to output files */
  209.    {
  210. sscanf(q, "%02x", &temp);     /* convert each byte to hex value */
  211. cksumlsb += temp;                /* calculate checksum for lsb     */
  212. q += 2;
  213.    }
  214.  
  215. cksummsb += efmark;        /* add value of eof mark  */
  216. cksumlsb += efmark;
  217.  
  218. cksummsb = ((~cksummsb) + 1) & 0x00FF ;  /* two's complement of checksum  */
  219. cksumlsb = ((~cksumlsb) + 1) & 0x00FF ;  /* and remove upper 8 bits       */
  220. }
  221.  
  222. error(s)     /* print error message  */
  223. {
  224.      printf(" Execution terminated \n" );
  225. switch(s)
  226. {
  227. case 5 :
  228.     printf(" Unknown tag %c encountered on line number %d \n",tag,nline);
  229.     exit();
  230.  
  231. case 4 :
  232.     printf(" Illegal tag %c encountered on line number %d \n",tag,nline);
  233.     printf(" Segments not supported. Define absolute addresses \n");
  234.     exit();
  235.  
  236. case 3 :
  237.     printf(" Illegal tag %c encountered on line number %d \n",tag,nline);
  238.     printf(" Unresolved external references \n");
  239.     exit();
  240.  
  241. case 2 :
  242.        printf(" File %s not found \n",filein);
  243.        exit();
  244.  
  245. case 1 :
  246.         printf(" Illegal object format in %s, K tag not found\n",filein);
  247.         exit();
  248. }
  249. }
  250.